package com.yesep.learn.mqtt.client.session;

import java.util.List;

import io.netty.handler.codec.mqtt.MqttMessage;
import io.netty.handler.codec.mqtt.MqttPublishMessage;

/**
 * 
 * @Description:
 */
public interface Session<K, V> {

	/**
	 * 保存消息
	 *
	 * @param msg 消息
	 */
	void retainMessage(MqttPublishMessage msg);

	/**
	 * 移除保留的消息
	 *
	 * @param id 消息ID
	 * @return {@link MqttPublishMessage}
	 */
	MqttPublishMessage removeRetain(int id);

	/**
	 * 返回已保存的所有消息
	 *
	 * @return {@link List<MqttPublishMessage>}
	 */
	List<MqttPublishMessage> retainedMessage();

	/**
	 * 保存待确认的消息，如QOS1，QOS2未收到确认的消息
	 *
	 * @param msg 消息
	 */
	void waitingConfirm(MqttMessage msg);

	/**
	 * 收到消息后
	 *
	 * @param id 消息ID
	 * @return 已确认的消息 {@link MqttMessage}
	 */
	MqttMessage confirmMessage(int id);

	/**
	 * 返回所有待确认的消息
	 *
	 * @return {@link List<MqttMessage>}
	 */
	List<MqttMessage> waitingConfirmMessage();

	/**
	 * 保存需要存储到session的数据
	 *
	 * @param key   键
	 * @param value 值
	 */
	void set(K key, V value);

	/**
	 * 获取存储在session中的值
	 *
	 * @param key 键
	 * @return key对应的值
	 */
	V get(K key);

}
